package utils
{
	import flash.utils.Dictionary;

	/**
	 * 对象池,<br>
	 * 如果使用getObject获取对象那么也必须用recycle函数回收对象才能达到效果
	 *@date 2016-7-11 下午5:25:08
	 *@author zhouhonghui
	 */
	public class ObjPoolUtil
	{
		/**每个对象池的最大长度**/
		private static var _num:int = 200;
		private static var _poolDict:Dictionary;
		
		public function ObjPoolUtil()
		{
		}
		
		/**
		 * 初始化 
		 * @param num 单个对象池最大长度默认 200
		 * 
		 */		
		public static function init(num:int=200):void
		{
			if(!_poolDict)
			{
				_poolDict = new Dictionary();
			}
			
		}
		/**
		 * 清空对象池 
		 * 
		 */		
		public static function clear():void
		{
			for each (var arr:Array in _poolDict) 
			{
				clearArr(arr);
			}			
		}
		/**
		 * 从池中取对象<br>
		 * 池中没有则创建,使用完毕销毁时用 recycle方法回收才能达到有效对象池功能
		 * @param cs
		 * @return 
		 * 
		 */		
		public static function getObject(cs:Class):*
		{
			var arr:Array = _poolDict[cs];
			var obj:*;
			if(arr)
			{
				obj = arr.shift();
			}else
			{
				obj =new cs();
			}
			return obj;
		}
		
		/**
		 * 回收对象 <br>
		 * 用完的对象只有回收了才能达到对象池的效果
		 * @param cs  对象的类
		 * @param obj 对象实例
		 * 
		 */			
		public static function recycle(cs:Class,obj:*):void
		{
			var arr:Array = _poolDict[cs];
			if(!arr)
			{
				arr = [];
				_poolDict[cs] = arr;
			}
			if(arr.length>=_num)
			{
				//池已经满了，把最早缓存的删掉
				arr.shift();				
			}
			arr.push(obj);
		}
		
		/**
		 * 清空数组 
		 * @param arr
		 * 
		 */		
		private static function clearArr(arr:Array):void
		{
			if(arr)
			{
				for (var i:int = 0; i < arr.length; i++) 
				{
					arr.splice(i,1);
					i--;
				}				
			}
		}
		
	}
}